home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / pascal / oop55.zip / LISTDEMO.PAS < prev    next >
Pascal/Delphi Source File  |  1989-05-02  |  4KB  |  187 lines

  1.  
  2. { Turbo List }
  3. { Copyright (c) 1989 by Borland Interational, Inc. }
  4.  
  5. program ListDemo;
  6. { From P-57 of the Object-Oriented Programming Guide.
  7.   Dynamic objects & destructors.
  8. }
  9.  
  10. uses Graph, Figures;
  11.  
  12. type
  13.   ArcPtr = ^Arc;
  14.   Arc = object(Circle)
  15.     StartAngle, EndAngle : Integer;
  16.     constructor Init(InitX, InitY : Integer;
  17.                      InitRadius : Integer;
  18.                      InitStartAngle, InitEndAngle : Integer);
  19.     procedure Show; virtual;
  20.     procedure Hide; virtual;
  21.   end;
  22.  
  23.   NodePtr = ^Node;
  24.   Node = record
  25.     Item : PointPtr;
  26.     Next : NodePtr;
  27.   end;
  28.  
  29.   ListPtr = ^List;
  30.   List = object
  31.     Nodes: NodePtr;
  32.     constructor Init;
  33.     destructor Done; virtual;
  34.     procedure Add(Item : PointPtr);
  35.     procedure Report;
  36.   end;
  37.  
  38. var
  39.   GraphDriver : Integer;
  40.   GraphMode : Integer;
  41.   Temp : String;
  42.   AList : List;
  43.   PArc : ArcPtr;
  44.   PCircle : CirclePtr;
  45.   RootNode : NodePtr;
  46.  
  47.  
  48. {--------------------------------------------------------}
  49. { Procedures that are not methods:                       }
  50. {--------------------------------------------------------}
  51.  
  52. procedure OutTextLn(TheText : String);
  53. begin
  54.   OutText(TheText);
  55.   MoveTo(0, GetY+12);
  56. end;
  57.  
  58.  
  59. procedure HeapStatus(StatusMessage : String);
  60. begin
  61.   Str(MemAvail : 6, Temp);
  62.   OutTextLn(StatusMessage+Temp);
  63. end;
  64.  
  65.  
  66. {--------------------------------------------------------}
  67. { Arc's method implementations:                          }
  68. {--------------------------------------------------------}
  69.  
  70. constructor Arc.Init(InitX, InitY : Integer;
  71.                      InitRadius : Integer;
  72.                      InitStartAngle, InitEndAngle : Integer);
  73.  
  74. begin
  75.   Circle.Init(InitX, InitY, InitRadius);
  76.   StartAngle := InitStartAngle;
  77.   EndAngle := InitEndAngle;
  78. end;
  79.  
  80. procedure Arc.Show;
  81. begin
  82.   Visible := True;
  83.   Graph.Arc(X, Y, StartAngle, EndAngle, Radius);
  84. end;
  85.  
  86. procedure Arc.Hide;
  87. var
  88.   TempColor : Word;
  89. begin
  90.   TempColor := Graph.GetColor;
  91.   Graph.SetColor(GetBkColor);
  92.   Visible := False;
  93.   Graph.Arc(X, Y, StartAngle, EndAngle, Radius);
  94.   SetColor(TempColor);
  95. end;
  96.  
  97.  
  98. {--------------------------------------------------------}
  99. { List's method implementations:                         }
  100. {--------------------------------------------------------}
  101.  
  102. constructor List.Init;
  103. begin
  104.   Nodes := nil;
  105. end;
  106.  
  107. destructor List.Done;
  108. var
  109.   N : NodePtr;
  110. begin
  111.   while Nodes <> nil do
  112.   begin
  113.     N := Nodes;
  114.     Nodes := N^.Next;
  115.     Dispose(N^.Item, Done);
  116.     Dispose(N);
  117.   end;
  118. end;
  119.  
  120.  
  121. procedure List.Add(Item : PointPtr);
  122. var
  123.   N : NodePtr;
  124. begin
  125.   New(N);
  126.   N^.Item := Item;
  127.   N^.Next := Nodes;
  128.   Nodes := N;
  129. end;
  130.  
  131. procedure List.Report;
  132. var
  133.   Current : NodePtr;
  134. begin
  135.   Current := Nodes;
  136.   while Current <> nil do
  137.     begin
  138.       Str(Current^.Item^.GetX : 3, Temp);
  139.       OutTextLn('X = '+Temp);
  140.       Str(Current^.Item^.GetY : 3, Temp);
  141.       OutTextLn('Y = '+Temp);
  142.       Current := Current^.Next;
  143.     end;
  144. end;
  145.  
  146.  
  147. {--------------------------------------------------------}
  148. { Main program:                                          }
  149. {--------------------------------------------------------}
  150.  
  151. begin
  152.   { Let the BGI determine what board you're using: }
  153.   DetectGraph(GraphDriver, GraphMode);
  154.   InitGraph(GraphDriver, GraphMode,'');
  155.   if GraphResult <> GrOK then
  156.     begin
  157.       WriteLn('>>Halted on graphics error: ',
  158.               GraphErrorMsg(GraphDriver));
  159.       Halt(1);
  160.     end;
  161.  
  162.   HeapStatus('Heap space before list is allocated: ');
  163.  
  164.   { Create a list }
  165.   AList.Init;
  166.  
  167.   { Now create and add several figures to it in one operation }
  168.   AList.Add(New(ArcPtr, Init(151, 82, 25, 200, 330)));
  169.   AList.Add(New(CirclePtr, Init(400, 100, 40)));
  170.   AList.Add(New(CirclePtr, Init(305, 136, 5)));
  171.  
  172.   { Traverse the list and display X,Y of the list's figures }
  173.   AList.Report;
  174.  
  175.   HeapStatus('Heap space after list is allocated ');
  176.  
  177.   { Deallocate the whole list with one destructor call }
  178.   AList.Done;
  179.  
  180.   HeapStatus('Heap space after list is cleaned up: ');
  181.  
  182.   OutText('Press Enter to end program: ');
  183.   Readln;
  184.  
  185.   CloseGraph;
  186. end.
  187.